{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "39a80aae-a990-4ed8-b880-3db2e7f70f16",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "if \"pyodide\" in sys.modules:\n",
    "    import piplite\n",
    "    await piplite.install('pyb2d-jupyterlite-backend>=0.4.2')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9d9f8d68-0f3b-49c1-9512-e3e8344e7342",
   "metadata": {},
   "outputs": [],
   "source": [
    "from b2d.testbed import TestbedBase\n",
    "import random\n",
    "import numpy\n",
    "import b2d\n",
    "\n",
    "\n",
    "class GaussMachine(TestbedBase):\n",
    "\n",
    "    name = \"Gauss Machine\"\n",
    "\n",
    "    def __init__(self, settings=None):\n",
    "        super(GaussMachine, self).__init__(settings=settings)\n",
    "\n",
    "        self.box_shape = 30, 20\n",
    "        box_shape = self.box_shape\n",
    "\n",
    "        # outer box\n",
    "        verts = numpy.array(\n",
    "            [(0, box_shape[1]), (0, 0), (box_shape[0], 0), (box_shape[0], box_shape[1])]\n",
    "        )\n",
    "        shape = b2d.chain_shape(vertices=numpy.flip(verts, axis=0))\n",
    "        box = self.world.create_static_body(position=(0, 0), shape=shape)\n",
    "\n",
    "        # \"bins\"\n",
    "        bin_height = box_shape[1] / 3\n",
    "        bin_width = 1\n",
    "        for x in range(0, box_shape[0], bin_width):\n",
    "            box = self.world.create_static_body(\n",
    "                position=(0, 0), shape=b2d.two_sided_edge_shape((x, 0), (x, bin_height))\n",
    "            )\n",
    "\n",
    "        # reflectors\n",
    "        ref_start_y = int(bin_height + box_shape[1] / 10.0)\n",
    "        ref_stop_y = int(box_shape[1] * 0.9)\n",
    "        for x in range(0, box_shape[0] + 1):\n",
    "\n",
    "            for y in range(ref_start_y, ref_stop_y):\n",
    "                s = [0.5, 0][y % 2 == 0]\n",
    "                shape = b2d.circle_shape(radius=0.3)\n",
    "                box = self.world.create_static_body(position=(x + s, y), shape=shape)\n",
    "\n",
    "        # particle system\n",
    "        pdef = b2d.particle_system_def(\n",
    "            viscous_strength=0.9,\n",
    "            spring_strength=0.0,\n",
    "            damping_strength=100.5,\n",
    "            pressure_strength=1.0,\n",
    "            color_mixing_strength=0.05,\n",
    "            density=2,\n",
    "        )\n",
    "\n",
    "        psystem = self.world.create_particle_system(pdef)\n",
    "        psystem.radius = 0.1\n",
    "        psystem.damping = 0.5\n",
    "\n",
    "        # linear emitter\n",
    "        emitter_pos = (self.box_shape[0] / 2, self.box_shape[1] + 10)\n",
    "        emitter_def = b2d.RandomizedLinearEmitterDef()\n",
    "        emitter_def.emite_rate = 400\n",
    "        emitter_def.lifetime = 25\n",
    "        emitter_def.size = (10, 1)\n",
    "        emitter_def.transform = b2d.Transform(emitter_pos, b2d.Rot(0))\n",
    "\n",
    "        self.emitter = b2d.RandomizedLinearEmitter(psystem, emitter_def)\n",
    "\n",
    "    def pre_step(self, dt):\n",
    "        self.emitter.step(dt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "51e5df1b-f5e6-486a-a6c0-173597198e5d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pyb2d_jupyterlite_backend.async_jupyter_gui import JupyterAsyncGui\n",
    "s = JupyterAsyncGui.Settings()\n",
    "s.resolution = [350,400]\n",
    "s.scale = 11\n",
    "tb = b2d.testbed.run(GaussMachine, backend=JupyterAsyncGui, gui_settings=s);"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
